/**
 * 菜单验证器
 * 提供菜单相关的请求数据验证规则
 */
import { body, param, query } from 'express-validator';

// 菜单创建验证规则
const createMenuValidator = [
  body('name')
    .notEmpty().withMessage('菜单名称不能为空')
    .isString().withMessage('菜单名称必须是字符串')
    .isLength({ min: 2, max: 50 }).withMessage('菜单名称长度必须在2-50之间'),
  
  body('menu_type')
    .notEmpty().withMessage('菜单类型不能为空')
    .isInt({ min: 1, max: 5 }).withMessage('菜单类型必须为1-5之间的整数')
    .custom((value, { req }) => {
      // 自定义验证：如果菜单类型不是权限控制类型(5)，则path和component必须存在
      if (parseInt(value) !== 5) {
        if (!req.body.path) {
          throw new Error('非权限控制类型菜单的路由路径不能为空');
        }
        if (!req.body.component) {
          throw new Error('非权限控制类型菜单的组件路径不能为空');
        }
      }
      return true;
    }),
  
  body('parent_id')
    .optional()
    .isInt({ min: 0 }).withMessage('父菜单ID必须是非负整数'),
  
  body('path')
    .optional()
    .isString().withMessage('路由路径必须是字符串')
    .isLength({ max: 255 }).withMessage('路由路径长度不能超过255个字符'),
  
  body('component')
    .optional()
    .isString().withMessage('组件路径必须是字符串')
    .isLength({ max: 255 }).withMessage('组件路径长度不能超过255个字符'),
  
  body('icon')
    .optional()
    .isString().withMessage('图标必须是字符串')
    .isLength({ max: 50 }).withMessage('图标长度不能超过50个字符'),
  
  body('sort')
    .optional()
    .isInt({ min: 0 }).withMessage('排序值必须是非负整数'),
  
  body('status')
    .optional()
    .isInt({ min: 0, max: 1 }).withMessage('状态值必须为0或1'),
];

// 菜单更新验证规则
const updateMenuValidator = [
  param('id')
    .notEmpty().withMessage('菜单ID不能为空')
    .isInt({ min: 1 }).withMessage('无效的菜单ID'),
  
  body('name')
    .optional()
    .isString().withMessage('菜单名称必须是字符串')
    .isLength({ min: 2, max: 50 }).withMessage('菜单名称长度必须在2-50之间'),
  
  body('menu_type')
    .optional()
    .isInt({ min: 1, max: 5 }).withMessage('菜单类型必须为1-5之间的整数')
    .custom((value, { req }) => {
      // 自定义验证：如果菜单类型不是权限控制类型(5)且存在，则path和component也必须存在
      if (parseInt(value) !== 5) {
        const { path, component } = req.body;
        if (path === null || path === '') {
          throw new Error('非权限控制类型菜单的路由路径不能为空');
        }
        if (component === null || component === '') {
          throw new Error('非权限控制类型菜单的组件路径不能为空');
        }
      }
      return true;
    }),
  
  body('parent_id')
    .optional()
    .isInt({ min: 0 }).withMessage('父菜单ID必须是非负整数'),
  
  body('path')
    .optional()
    .isString().withMessage('路由路径必须是字符串')
    .isLength({ max: 255 }).withMessage('路由路径长度不能超过255个字符'),
  
  body('component')
    .optional()
    .isString().withMessage('组件路径必须是字符串')
    .isLength({ max: 255 }).withMessage('组件路径长度不能超过255个字符'),
  
  body('icon')
    .optional()
    .isString().withMessage('图标必须是字符串')
    .isLength({ max: 50 }).withMessage('图标长度不能超过50个字符'),
  
  body('sort')
    .optional()
    .isInt({ min: 0 }).withMessage('排序值必须是非负整数'),
  
  body('status')
    .optional()
    .isInt({ min: 0, max: 1 }).withMessage('状态值必须为0或1'),
];

// 菜单ID验证规则
const menuIdValidator = [
  param('id')
    .notEmpty().withMessage('菜单ID不能为空')
    .isInt({ min: 1 }).withMessage('无效的菜单ID'),
];

// 角色ID验证规则(用于根据角色ID获取菜单)
const roleIdValidator = [
  param('roleId')
    .notEmpty().withMessage('角色ID不能为空')
    .isInt({ min: 1 }).withMessage('无效的角色ID'),
];

// 菜单查询参数验证规则
const menuQueryValidator = [
  query('name')
    .optional()
    .isString().withMessage('菜单名称必须是字符串'),
  
  query('status')
    .optional()
    .isInt({ min: 0, max: 1 }).withMessage('状态值必须为0或1'),
    
  query('menu_type')
    .optional()
    .isInt({ min: 1, max: 5 }).withMessage('菜单类型必须为1-5之间的整数'),
];

export {
  createMenuValidator,
  updateMenuValidator,
  menuIdValidator,
  roleIdValidator,
  menuQueryValidator
}; 